/*
 * IndexStrategy.h
 *
 *  Created on: 03/10/2009
 *      Author: nik0l4z
 */

#ifndef INDEXSTRATEGY_H_
#define INDEXSTRATEGY_H_
#include "iostream"
#include "../Externa/Clave.h"
#include "../Externa/Dato.h"
#include "../Storage/StorageStrategy.h"
#include "Almacenamiento.h"

using namespace std;



class IndexStrategy {

	public: enum indexType {BSharp , Hash, SecuencialIndex, BlackHole };

	public: Almacenamiento * almacenamiento;

	public: IndexStrategy();

	public:	virtual ~IndexStrategy();

	public: StorageStrategy *storageStrategy;


	public: virtual void saludar();

	/**
	 * Verifica la unicidad de la clave a insertar en el indice
	 */
	public: virtual bool checkUniqueness(Clave *clave, Dato *dato);

	/**
	 * Luego de una insercion/modificacion en disco, actualiza el indice con la referencia al
	 * archivo (Numero de bloque,registro o linea en caso de los archivo de texto)
	 */
	public: virtual void updateIndex(int fileReference,Clave *clave, Dato *dato);

	/**
	 * Metodo que, apartir de una clave, me devuelve la posicion en la que se
	 * encuentra el dato correspondiente a esa clave, en la estructura que se esta
	 * usando (Archivo o Buffer)
	 * En caso de no encontrarla, devuelve un valor negativo.
	 */
	public: virtual int getStorageReferenceByKey(Clave *clave);

    /**
     * Metodo que que borra la clave del indice actualizandolo.Devuelve un numero negativo en caso de error.
     */
	public: virtual int deleteKey(Clave *clave);


	/*------------------------ Getter & Setters --------------------------------------------------*/

	/**
	 * Workaround agregado, dado que las distintas estrategias de indexado comparten una misma interfaz, y su comportamiento no se el mismo
	 * Problema de Arquitectura.
	 */
	public: virtual int getClassName();

	public: void SetStorageStrategy(StorageStrategy *storageStrategy);

	public: StorageStrategy * GetStorageStrategy() const;

	public: virtual Almacenamiento * getStorage() const;

	public: virtual void setStorage(Almacenamiento *storage);




};

#endif /* INDEXSTRATEGY_H_ */
